package hash;

import org.apache.commons.codec.binary.Base64;
import org.junit.Test;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;

public class Test1Byte {
    @Test
    public void test1(){
        Provider[] providers= Security.getProviders();
        for(Provider provider:providers){
            System.out.println(provider.getName());
        }
    }

    /**
     * 符合扩展：
     * （1）符号扩展（Sign Extension）用于在数值类型转换时扩展二进制位的长度，
     * 以保证转换后的数值和原数值的符号（正或负）和大小相同，一般用于较窄的类型（如byte）
     * 向较宽的类型（如int）转换。扩展二进制位长度指的是，
     * 在原数值的二进制位左边补齐若干个符号位（0表示正，1表示负）。
     *（2）举例来说，如果用6个bit表示十进制数10，二进制码为"00 1010"，
     * 如果将它进行符号扩展为16bits长度，结果是"0000 0000 0000 1010"，
     * 即在左边补上10个0（因为10是正数，符号为0），符号扩展前后数值的大小和符号都保持不变；
     * 如果用10bits表示十进制数-15，使用“2的补码”编码后，二进制码为"11 1111 0001"，
     * 如果将它进行符号扩展为16bits，结果是"1111 1111 1111 0001",
     * 即在左边补上6个1（因为-15是负数，符号为1），符号扩展前后数值的大小和符号都保持不变。
     *
     * see  https://blog.csdn.net/z69183787/article/details/78703079
     */

    @Test
    public void test2(){
        System.out.println(0xfffffffe);
        System.out.println("=");
        byte b=-1;
        System.out.println((int)(char)b);
        System.out.println((int)(char)(b & 0xff));



    }

    /**
     *
     * 一：int(32位) -> byte(8位)
     * -1是int型的字面量，根据“2的补码”编码规则，编码结果为0xffffffff，即32位全部置1.
     * 转换成byte类型时，直接截取最后8位，所以byte结果为0xff，对应的十进制值是-1.
     *
     * 二：byte(8位) -> char(16位)
     * 由于byte是有符号类型，所以在转换成char型（16位）时需要进行符号扩展，
     * 即在0xff左边连续补上8个1（1是0xff的符号位），结果是0xffff。由于char是无符号类型，
     * 所以0xffff表示的十进制数是65535
     *
     * 三：char(16位) -> int(32位)
     *由于char是无符号类型，转换成int型时进行零扩展，即在0xffff左边连续补上16个0，
     * 结果是0x0000ffff,对应的十进制数是65535
     */

    @Test
    public void test3(){
        System.out.println((int)(char)(byte)-1);
    }

    /**
     * <<表示左移移，不分正负数，低位补0；
     *
     * >>表示右移，如果该数为正，则高位补0，若为负数，则高位补1；
     *
     * >>>表示无符号右移，也叫逻辑右移，即若该数为正，则高位补0，而若该数为负数，则右移后高位同样补0
     */
    @Test
    public void test4(){
        System.out.println(0<<1);
    }





    @Test
    public void test(){

    }

}
